package com.iot.ruler.caster;

import lombok.Getter;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * 订阅者
 *
 * @author lzb
 * @Date 2023/2/16 17:03
 */
@Getter
public abstract class RulerSubscriber<T extends RulerSubject<?>> {

    private final String publisherName;

    public RulerSubscriber() {
        RulerCaster.register(this);
        Type type = getClass().getGenericSuperclass();
        Type typeArgument = ((ParameterizedType) type).getActualTypeArguments()[0];
        publisherName = ((Class<T>) typeArgument).getName();
    }

    /**
     * 数据分发调用本方法将数据分发进来
     * 只允许本包调用
     *
     * @param subject 观察的对象
     */
    void accept(RulerSubject<?> subject) {
        onSubject((T) subject);
    }

    /**
     * 子类实现，数据更新回调
     *
     * @param subject 主题，携带数据
     */
    protected abstract void onSubject(T subject);
}
